/***********************************************************************************
 * 文件名： rhc.h
 * 版本： 12
 * 说明：
 * 		RHC(Resistance heating controller 电阻加热控制器)，通过PWM控制发热电阻获得的电压值来
 *  控制发热，实现按照指定电压、功率、温度进行加热。
 *      目前只支持固定PWM占空比、平均电压。
 * 修改记录：
 * 	2021/04/21: 初版。 刘言。
 *  2021/05/07: 增加空载检测功能。刘言。
 *  2021/06/29: 增加正推ADC模式（模式1）支持。
 *  2021/07/07: 增加工作模式静态选择功能，增加 恒定PWM占空比模式 。
 *  2021/07/12: 增加模式切换功能。
 *  2021/07/14: 增加输出端口分压电阻比例设置。
 *  2021/07/15: 增加 负载已装入 事件： _RHC_USE_LOADED_EVENT 。现在可以同时发送多个事件。
 *  2022/06/08: 优化AD正推模式下的恒功率算法。刘言
 *  2023/09/06: 添加伪功率模式，多通道输出。黄均铭【未完成】
 *  2023/10/11: 添加电流检测IC模式
 *  2024/01/12: 添加回调函数配置。黄均铭
 ***********************************************************************************/
#ifndef _RHC_H_
#define _RHC_H_

#include <stddef.h>
#ifdef __NO_INCLUDE_PATH // 如果有，定义在 stddef.h
#include "..\..\..\projects\prj\app\peripherals_config.h"
#else
#include "rhc_config.h"
#endif

#include "..\..\polsys.h"

typedef enum _rhc_ev
{
    RHC_EV_NULL = 0,
    RHC_EV_SHORT_OUT = (1 << 0),  // 短路保护了，已经关闭了输出。
    RHC_EV_NO_BATTERY = (1 << 1), // 没电保护了，已经关闭了输出。
#ifdef _RHC_USE_NOLOAD_HINT
    RHC_EV_NO_LOAD = (1 << 2),    // 输出时发现无负载（空载）
#endif
#ifdef _RHC_USE_LOAD_CHECK
    RHC_EV_LOADED = (1 << 3),   // 接入了负载
    RHC_EV_UNLOADED = (1 << 4), // 断开了负载
#endif
    _RHC_EV_END
} rhc_ev_t;

typedef enum _rhc_mode
{
    RHC_MODE_CONST_PWM = 0,
    RHC_MODE_AVG_VOLTAGE,
    RHC_MODE_RMS_VOLTAGE,
    RHC_MODE_POWER,
    RHC_MODE_TEMPERATURE,
    _RHC_MODE_END
} rhc_mode_t;

typedef enum _rhc_load_status
{
    RHC_LOAD_NULL,
    RHC_NO_LOAD, // 空载
    RHC_LOADED,  // 恒阻负载
    _RHC_LOAD_END
} rhc_load_status_t;

#if (_RHC_FULL_ADV > 256)
typedef u16 rhc_adc_t;
typedef u32 rhc_sum_t;
#else
typedef u8 rhc_adc_t;
typedef u16 rhc_sum_t;
#endif

// 用来通知异常状态
typedef void (*rhc_event_callback_t)(rhc_ev_t e);

// 仅仅是为了使用伪函数优化而曝光以下属性，不直接操作，需要通过API接口

extern u16 _RHC_mTarget; // 目标值
extern rhc_mode_t _RHC_mMode;
extern rhc_adc_t RHC_mOutAdv;
#if _RHC_AD_MODE == 0
extern rhc_adc_t RHC_mVrefAdv;
#else
extern rhc_adc_t RHC_mVbatAdv;
#endif
#ifdef _RHC_USE_ACTUAL_PARAM
extern u16 RHC_mActualOutParam;
#endif

// APIs

// 外部事件，这些函数由外部模块调用，用来通知本模块事件发生了

// PWM周期的 ON 跳变（开启输出），一般在PWM中断中调用。
void RHC_EvPWMOutON();

// AD转换完成，一般在ADC中断中调用
void RHC_EvADCCompleted(rhc_adc_t adv);

#ifdef POLSYS_LITE
// 间隔10~100ms执行一次，注意：如果开启雾化器接入检测，休眠唤醒之后也需要执行（部分功能需要休眠时处理）
// 任务函数，这个函数必须按照要求定时调用（看作是线程入口）
void RHC_Task();
#endif

// 提供的调用接口

// 初始化
// 内部已经初始化了 PWM 发生器
void RHC_Init();

#ifdef _RHC_USE_MODE_SWITCH
// 设置控制输出的目标值
// value： 电压(mV)或者PWM值
#define RHC_SetTarget(u16_value) _RHC_mTarget = u16_value
#else
// 设置控制输出的目标值
// value： 电压(mV)、功率(mW)或者PWM值
#define RHC_SetTarget(u16_value)                     \
    {                                                \
        _RHC_mTarget = u16_value + _RHC_TARGET_CPST; \
    }
#endif

// 通过OAVL的AD值计算阻值
u16 RHC_AdvOvalToRes(rhc_adc_t adv);

#ifdef _RHC_USE_LOAD_RES
// 负载阻值更新。请注意：内部不包含中断开关操作。
#if _RHC_LOAD_NUM > 1
#ifdef _RHC_USE_CURRENT
u16 RHC_UpdateRes(u8 ch, u8 adc_ch, u8 div_ch);
#else
u16 RHC_UpdateRes(u8 ch, u8 adc_ch);
#endif
#else
u16 RHC_UpdateRes(void);
#endif
#endif

// 开始运作，将会开始按照设定参数输出
void RHC_Start();

// 停止输出，执行后会立即关闭输出
void RHC_Stop();

#ifdef _RHC_USE_MODE_SWITCH
// 设置工作模式，注意切换模式后的目标值
#define RHC_SetMode(rhc_mode_t_mode)  \
    {                                 \
        _RHC_mMode = rhc_mode_t_mode; \
    }
#endif

// 获取输出时最后一次OVAL通道和基准通道ADC值
#define RHC_GetOutAdv() RHC_mOutAdv

#if _RHC_AD_MODE == 0
#define RHC_GetVrefAdv() RHC_mVrefAdv
#else
#define RHC_GetVbatAdv() RHC_mVbatAdv
#endif

#ifdef _RHC_USE_ACTUAL_PARAM
// 获取实际输出参数
#define RHC_GetActualOutParam() RHC_mActualOutParam
#endif

#ifdef _RHC_USE_CALLBACK
// 设置消息通知回调函数
void RHC_SetCallBack(rhc_event_callback_t event_callback);

#endif

#ifdef _RHC_USE_LOAD_CHECK
// 获取当前负载状态（软件层面） true：已连接
bool RHC_GetLoadStatus();
#endif

#endif
